/**********************************************************\
 |                                                          |
 |                          hprose                          |
 |                                                          |
 | Official WebSite: http://www.hprose.com/                 |
 |                   http://www.hprose.org/                 |
 |                                                          |
 \**********************************************************/
/**********************************************************\
 *                                                        *
 * BooleanObjectUnserializer.java                         *
 *                                                        *
 * Boolean unserializer class for Java.                   *
 *                                                        *
 * LastModified: Aug 3, 2016                              *
 * Author: Ma Bingyao <andot@hprose.com>                  *
 *                                                        *
 \**********************************************************/
package net.hasor.libs.com.hprose.io.unserialize;
import java.io.IOException;
import java.lang.reflect.Type;
import java.math.BigInteger;

import static net.hasor.libs.com.hprose.io.HproseTags.*;
public class BooleanObjectUnserializer extends BaseUnserializer<Boolean> {
    public final static BooleanObjectUnserializer instance = new BooleanObjectUnserializer();
    @Override
    public Boolean unserialize(Reader reader, int tag, Type type) throws IOException {
        if (tag == TagTrue)
            return true;
        if (tag == TagFalse)
            return false;
        if (tag == '0')
            return false;
        if (tag >= '1' && tag <= '9')
            return true;
        switch (tag) {
        case TagInteger:
            return ValueReader.readInt(reader) != 0;
        case TagLong:
            return !(BigInteger.ZERO.equals(ValueReader.readBigInteger(reader)));
        case TagDouble:
            return ValueReader.readDouble(reader) != 0.0;
        case TagEmpty:
            return false;
        case TagNaN:
            return true;
        case TagInfinity:
            reader.stream.read();
            return true;
        case TagUTF8Char:
            return "\00".indexOf(ValueReader.readChar(reader)) == -1;
        case TagString:
            return Boolean.parseBoolean(ReferenceReader.readString(reader));
        }
        return super.unserialize(reader, tag, type);
    }
    public Boolean read(Reader reader) throws IOException {
        return read(reader, Boolean.class);
    }
}